/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package table.atributos;

import java.text.ParseException;
import java.util.ArrayList;
import java.util.List;
import javax.swing.table.AbstractTableModel;
import javax.swing.text.MaskFormatter;
import model.AtributosMODEL;
import model.CorMODEL;
import model.NumeracaoMODEL;
import table.Pair;
import table.TooltipCellRender;

/**
 *
 * @author Welisson
 */
public class AtributosTable extends AbstractTableModel {

    private static final int COL_COR = 0;
    private static final int COL_NUM = 1;
    private static final int COL_QTD = 2;
    
    private TooltipCellRender renderer = new TooltipCellRender();
    private List<AtributosMODEL> atributos;
    private List<CorMODEL> cores;
    private List<NumeracaoMODEL> numeracoes;

    public AtributosTable(List<CorMODEL> cores, List<NumeracaoMODEL> numeracoes) {
        this.atributos = new ArrayList<AtributosMODEL>();
        this.cores = cores;
        this.numeracoes = numeracoes;
    }

    @Override
    public int getRowCount() {
        return atributos.size();
    }

    @Override
    public int getColumnCount() {
        return 3;
    }

    @Override
    public Object getValueAt(int rowIndex, int columnIndex) {
        AtributosMODEL atributo = atributos.get(rowIndex);

        if (columnIndex == COL_COR) {
            String cor = "";
            for(CorMODEL c : cores){
                if(c.getId() == atributo.getCor()){
                    cor = c.getCor();
                    break;
                }
            }
            return new Pair<String, String>(cor, cor);
        } else if (columnIndex == COL_NUM) {
            String numeracao = "";
            for(NumeracaoMODEL n : numeracoes){
                if(n.getId() == atributo.getNum()){
                    numeracao = n.getDe()+" Até "+n.getAte();
                }
            }
            return new Pair<String, String>(numeracao, numeracao);
        } else if (columnIndex == COL_QTD) {
            return new Pair<Integer, Integer>(atributo.getQtd(), atributo.getQtd());
        }

        return null;
    }

    @Override
    public String getColumnName(int column) {
        String coluna = "";
        switch (column) {
            case COL_COR:
                coluna = "Cor";
                break;
            case COL_NUM:
                coluna = "Numero";
                break;
            case COL_QTD:
                coluna = "Quantidade";
                break;
            default:
                throw new IllegalArgumentException("Coluna Inválida");
        }
        return coluna;
    }

    @Override
    public Class<?> getColumnClass(int columnIndex) {
        if (columnIndex == COL_COR) {
            return String.class;
        } else if (columnIndex == COL_NUM) {
            return String.class;
        } else if (columnIndex == COL_QTD) {
            return int.class;
        }
        return null;
    }

    public AtributosMODEL get(int row) {
        return atributos.get(row);
    }
    
    public List<AtributosMODEL> getAll(){
        return atributos;
    }

    public Object get(int rowIndex, int columnIndex) {
        AtributosMODEL atr = atributos.get(rowIndex);

        if (columnIndex == COL_COR) {
            return atr.getCor();
        } else if (columnIndex == COL_NUM) {
            return atr.getNum();

        } else if (columnIndex == COL_QTD) {
            return atr.getQtd();

        } 

        return null;
    }

    // Adiciona o sócio especificado ao modelo
    public void addAtributo(AtributosMODEL atributo) {
        // Adiciona o registro.
        
        this.atributos.add(atributo);
        // Pega a quantidade de registros e subtrai 1 para
        // achar o último índice. A subtração é necessária
        // porque os índices começam em zero.
        int ultimoIndice = getRowCount() - 1;
        
        // Notifica a mudança.
        fireTableRowsInserted(ultimoIndice, ultimoIndice);
    }

    public int exists(AtributosMODEL atributo){
        int linha = 0;
        for (AtributosMODEL atr : atributos) {
            if(atributo.getCor() == atr.getCor()){
                if(atributo.getNum() == atr.getNum()){
                    return linha;
                }
            }
            linha++;
        }
        linha = -1;
        return linha;
    }
    
    public void updateAtributo(int indiceLinha, AtributosMODEL atributo) {
        int qtd = atributo.getQtd();
        atributo.setQtd(atributos.get(indiceLinha).getQtd()+qtd);
        
        this.atributos.set(indiceLinha, atributo);
        fireTableRowsUpdated(indiceLinha, indiceLinha);
    }

    // Remove o sócio da linha especificada.
    public void removeAtributo(int indiceLinha) {
        // Remove o registro.
        
        atributos.remove(indiceLinha);

        // Notifica a mudança.
        fireTableRowsDeleted(indiceLinha, indiceLinha);
    }
    
    public void removeAll(){
        
        atributos.clear();
        fireTableDataChanged();
    }

    private String format(String pattern, Object value) {
        MaskFormatter mask;
        try {
            mask = new MaskFormatter(pattern);
            mask.setValueContainsLiteralCharacters(false);
            return mask.valueToString(value);
        } catch (ParseException e) {
            throw new RuntimeException(e);
        }
    }

}
